package es.udc.acs.banco.ui;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLException;


import es.udc.acs.banco.client.BancoClient;
import es.udc.acs.banco.operations.DBInicializarBancoOperations;
import es.udc.acs.banco.operations.DBUIBancoOperations;
import es.udc.acs.banco.sesion.ControlSesion;
import es.udc.acs.banco.sesion.Sesion;
import es.udc.acs.banco.util.GestorProperties;
import es.udc.acs.database.Database;
import es.udc.acs.database.exception.ConexionInvalidaException;
import es.udc.acs.parser.ParserMensaje;

public class MainBanco {	

	private static String idBanco;	
    
    public static void main(String[] args) { 	   

		
		// crea una sesion nueva en caso de que no exista
	    try {
			Database db = Database.getInstancia();

			db.establecerConexion();
		    
			pedirNumero();		
			idBanco =  GestorProperties.devolverPropiedad(GestorProperties.IDBANCO);	    

			modoInicializar();
			ControlSesion.obtenerSesion();
		    menu();

			//db.cerrarConexion();
		} catch (Exception e) {		
			e.printStackTrace();
		}
	}
    
    private static void pedirNumero() {
    	
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));
		
		String op = "";
		
		while(true){

			System.out.println("Inserte numero del banco (2 cifras):");
			
		    try {
				op = (br.readLine());
				System.out.println("");
			} catch (IOException e) {
				System.out.println("Opcion no valida.");
				e.printStackTrace();
			}
		    if (op.length() == 2){	
				GestorProperties.setBancoNum(op);
				break;
			}else 
				System.out.println("Opcion no valida.");
		}
			
    }
    
    private static void modoInicializar() {
    	
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));
		
		String op = "";
		
		while(true){
			System.out.println("Inicio limpio del banco? (si/no)");
			
		    try {
				op = (br.readLine());
				System.out.println("");
			} catch (IOException e) {
				System.out.println("Opcion no valida.");
				e.printStackTrace();
			}
		    if (!op.equals("si") && !op.equals("no")){	
				System.out.println("Opcion no valida.");
			}else {
				if (op.equals("si")) {
					try {
						DBInicializarBancoOperations.inicializarBancoDB(idBanco);
					} catch (Exception e) {
						System.out.println("Error al borrar entradas antiguas");
						e.printStackTrace();
					}
				}else {
				// sino hay que arrancar el servidor
				BancoClient.arrancarServidor(Integer.parseInt(
						ParserMensaje.obtenerPuerto(GestorProperties.
						devolverPropiedad(GestorProperties.PUERTOBANCO))));
				}
				break;
			}
		}			
    }
	
	private static void menu() {
		
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));
		
		while(true){
			String op = "";
			
			printOpcionesMenu();
			
		    try {
				op = (br.readLine());
				System.out.println("");
			} catch (IOException e) {
				System.out.println("Opcion no valida.");
				e.printStackTrace();
			}
			if (op.equals("1")){	
				verSaldo();
			}else if (op.equals("2")){
				verMovimientos();
			}else if (op.equals("3")){
				verCuentasTarjetas();
			}else if (op.equals("4")){
				verCanales();
			}else if (op.equals("5")){
				modoVisualizacion();
			}else if (op.equals("6")){							
				opcionesSolicitud();				
			}else if (op.equals("7")){					
				opcionesNoContestar();				
			}else if (op.equals("8")){
				break;
			}else 
				System.out.println("Opcion no valida.");
		}
	}
	

	private static void modoVisualizacion() {
		
		try {
			ControlSesion.obtenerSesion().setModoVisualizar(true);
			
			BufferedReader br = 
					new BufferedReader(new InputStreamReader(System.in));
			
			System.out.println("MODO VISUALIZACION:");
			System.out.println(">>Pulse enter para parar<<:");
			br.readLine();	
		
			ControlSesion.obtenerSesion().setModoVisualizar(false);
			
			System.out.println("Parado");
		} catch (Exception e) {}
	}

	private static void printOpcionesMenu() {
		
		System.out.println("");
		verEstadoSesion();
		verModoForzarRecuperacion();
		System.out.println("");
		System.out.println("Seleccione operacion:");
		System.out.println("\t1.-Ver saldo cuentas.");
		System.out.println("\t2.-Ver movimientos cuenta.");
		System.out.println("\t3.-Ver cuentas tarjetas.");
		System.out.println("\t4.-Situacion canales.");
		System.out.println("\t5.-Ver mensajes tiempo real.");
		System.out.println("\t6.-Solicitudes.");
		System.out.println("\t7.-Modo no contestar.");		
		System.out.println("\n\t8.- Salir.");
	}
	
	private static void verSaldo() {
		try {
			DBUIBancoOperations.verSaldoCuentas(idBanco);
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
	
	private static void verMovimientos() {
		
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));
		String op = "";
		
		System.out.println("Introduzca el numero de cuenta:");
		try {
			op = (br.readLine());
			System.out.println("");
			
			try {
				DBUIBancoOperations.verMovimientosCuenta(
						idBanco,Integer.parseInt(op));
			} catch (ConexionInvalidaException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				System.out.println(
						"Error:No existe cuenta o no hay movimientos:");
			} catch (NumberFormatException e) {
				System.out.println("Error:Cuenta no valida");
			}
			
		} catch (IOException e) {
			System.out.println("Error:Cuenta no valida.");
			e.printStackTrace();
		}		
		
	}
	
	private static void verCuentasTarjetas() {
		try {
			DBUIBancoOperations.verCuentasTarjetas(idBanco);
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
	
	private static void verCanales() {
		
		try {
			Sesion s = ControlSesion.obtenerSesion();
			
			if (s.obtenerEstado().equals("cerrada")) {
				System.out.println("Error:No hay sesion");
			} else {		
				s.mostrarEstadoCanales();
			}
				
		} catch (Exception e) {
			System.out.println("Error:No hay sesion");
		}
	}
	
	
	private static void opcionesSolicitud() {		
		
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));

		String op = "";
		
		System.out.println("Seleccione solicitud:");
		System.out.println("\t1.-Apertura de sesion.");
		System.out.println("\t2.-Detencion de trafico.");	
		System.out.println("\t3.-Reanudar trafico.");		
		System.out.println("\t4.-Cierre de sesion.");
		System.out.println("\t5.-Salir.");			    
		try {
			op = (br.readLine());
			System.out.println("");
		} catch (IOException e) {
			System.out.println("Error:Opcion no valida.");
			e.printStackTrace();
		}				
		if (op.equals("1")){		
			BancoClient.enviarAperturaSesion();
		}else if (op.equals("2")){
			BancoClient.enviarDetenerTrafico();
		}else if (op.equals("3")){
			BancoClient.enviarReanudarTrafico();
		}else if (op.equals("4")){
			BancoClient.enviarCierreSesion();
		}else if (op.equals("5")){
			return;
		}else 
			System.out.println("Error:Opcion no valida.");		
	}
	
	
	private static void opcionesNoContestar() {	
		
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));

		String op = "";
	        
		try {
			if (ControlSesion.obtenerSesion().obtenerEstado().equals("cerrada"))
				System.out.println("Error:No hay sesion");
			else {
				
				System.out.println("Seleccione opcion:");
				System.out.println("\t1.-Activar.");
				System.out.println("\t2.-Desactivar.");				
				System.out.println("\t3.-Salir.");
				
				verModoForzarRecuperacion();
			    
			    try {
					op = (br.readLine());
					System.out.println("");
				} catch (IOException e) {
					System.out.println("Error:Opcion no valida.");
					e.printStackTrace();
				}	
				if (op.equals("1")){		
					try {
						ControlSesion.obtenerSesion().setForzarRecuperacion(true);
					} catch (Exception e) {
						System.out.println("Error:No hay sesion");
					}
				}else if (op.equals("2")){
					try {
						ControlSesion.obtenerSesion().setForzarRecuperacion(false);
					} catch (Exception e) {
						System.out.println("Error:No hay sesion");
					}
				}else if (op.equals("3")){
					return;
				}else 
					System.out.println("Error:Opcion no valida.");		
			}
		} catch (Exception e) {
			System.out.println("Error:No hay sesion");
		}
	}
	
	private static void verEstadoSesion() {
		
		String sesion = "No hay sesion";
		
	    try {
			sesion = ControlSesion.obtenerSesion().obtenerEstado();			
		} catch (Exception e) {
		}	
	    
	    System.out.println(">Estado sesion: "+sesion);
	}
	

	private static void verModoForzarRecuperacion() {
		
	    String rec = "desactivado";
	    try {
			if (ControlSesion.obtenerSesion().isForzarRecuperacion()) {
				rec = "activado";
			}
		} catch (Exception e) {
		}	
	    
	    System.out.println(">Modo forzar recuperación: "+rec);
	}

	
}
